#if defined (_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif

#ifndef JETBYTE_TOOLS_WIN32_IO_COMPLETION_PORT_INCLUDED__
#define JETBYTE_TOOLS_WIN32_IO_COMPLETION_PORT_INCLUDED__


#ifndef _WINDOWS_
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN
#endif

///////////////////////////////////////////////////////////////////////////////
// Namespace: OldDreamTools::Win32
///////////////////////////////////////////////////////////////////////////////

namespace OldDreamTools {
namespace Win32 {

///////////////////////////////////////////////////////////////////////////////
// CIOCompletionPort
///////////////////////////////////////////////////////////////////////////////

class CIOCompletionPort
{
   public:

      explicit CIOCompletionPort(
         size_t maxConcurrency);

      ~CIOCompletionPort();

   void AssociateDevice(
      HANDLE hDevice,
      ULONG_PTR completionKey);

   void PostStatus(
      ULONG_PTR completionKey,
      DWORD dwNumBytes = 0,
      OVERLAPPED *pOverlapped = 0);

   void GetStatus(
      ULONG_PTR *pCompletionKey,
      PDWORD pdwNumBytes,
      OVERLAPPED **ppOverlapped);

   bool GetStatus(
      ULONG_PTR *pCompletionKey,
      PDWORD pdwNumBytes,
      OVERLAPPED **ppOverlapped,
      DWORD dwMilliseconds);

   private:

      HANDLE m_iocp;

      // No copies do not implement
      CIOCompletionPort(const CIOCompletionPort &rhs);
      CIOCompletionPort &operator=(const CIOCompletionPort &rhs);
};

///////////////////////////////////////////////////////////////////////////////
// Namespace: OldDreamTools::Win32
///////////////////////////////////////////////////////////////////////////////

} // End of namespace Win32
} // End of namespace OldDreamTools

///////////////////////////////////////////////////////////////////////////////
// Lint options
//
//lint -restore
//
///////////////////////////////////////////////////////////////////////////////

#endif //JETBYTE_TOOLS_WIN32_IO_COMPLETION_PORT_INCLUDED__

///////////////////////////////////////////////////////////////////////////////
// End of file
///////////////////////////////////////////////////////////////////////////////
